package br.com.vpsa.previdordevendas.model.service.impl;

import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.vpsa.previdordevendas.model.entity.EntidadePadrao;
import br.com.vpsa.previdordevendas.model.pojo.EntidadePojo;
import br.com.vpsa.previdordevendas.model.service.EntidadeService;
import br.com.vpsa.previdordevendas.model.util.HttpUtils;
import br.com.vpsa.previdordevendas.model.util.JsonUtils;

import com.google.gson.reflect.TypeToken;

@Service
public class EntidadeServiceImpl implements EntidadeService
{

    @PersistenceContext
    private EntityManager em;
    
	@Override
	public List<EntidadePojo> listarTodas() 
	{
		String jsonEntidades = HttpUtils.requestGetHttpsAutenticada("https://www.vpsa.com.br/apps/api/entidades");
		
		List<EntidadePojo> entidades = JsonUtils.getList(jsonEntidades, new TypeToken<List<EntidadePojo>>(){}.getType());
		
		Collections.sort(entidades);
		
		return entidades;
	}

	@Override
	public EntidadePojo carregarPorId(Long idEntidade) 
	{
		EntidadePojo entidadePojo = null; 
		
		if( idEntidade != null && idEntidade >= 0L){
			String jsonEntidade = HttpUtils.requestGetHttpsAutenticada("https://www.vpsa.com.br/apps/api/entidades/"+idEntidade);
		
			entidadePojo = JsonUtils.getObject(jsonEntidade,EntidadePojo.class);
		}
		
		return entidadePojo;
	}

	@Override
	public EntidadePadrao getEntidadePadrao(String base) {
		String hql = "from EntidadePadrao e where e.base = :base";
		
		TypedQuery<EntidadePadrao> query = em.createQuery(hql, EntidadePadrao.class);
		query.setParameter("base", base);
		
		List<EntidadePadrao> entidadesPadrao = query.getResultList();
		
		return entidadesPadrao.isEmpty() ? null : entidadesPadrao.get(0);
	}

	
	
	@Override
	@Transactional
	public EntidadePadrao salvarEntidadePadrao(EntidadePadrao entidadePadrao) {
		return em.merge(entidadePadrao);
	}

	@Override
	public Long getIdEntidadePadrao(String base) {
		EntidadePadrao entidadePadrao = getEntidadePadrao(base);
		
		return entidadePadrao != null ? entidadePadrao.getIdEntidadePadrao() : null;
	}
	
	
}
